package com.hemerasolutions.v2trainer.util.primefaces;


import java.util.ArrayList;
import java.util.List;

import javax.el.ValueExpression;
import javax.faces.component.UIComponent;
import javax.faces.component.UINamingContainer;
import javax.faces.context.FacesContext;

import org.primefaces.component.api.UIColumn;
import org.primefaces.component.column.Column;
import org.primefaces.component.columns.Columns;

public class CustomDataTable extends org.primefaces.component.datatable.DataTable {

    private List<UIColumn> columns;
	
    public CustomDataTable(){
    	super();
    }
    
    @Override 
    protected String getSelectedRowKeysAsString() {
    	return super.getSelectedRowKeysAsString();
    }
    
    @Override 
    protected List<Object> getSelectedRowKeys() {
        return super.getSelectedRowKeys();
    }
    
	
    @Override 
    protected void findSelectedRowKeys() {
    	super.findSelectedRowKeys();
    }    
    
	@Override    
    public List<UIColumn> getColumns() {
        if(columns == null) {
            columns = new ArrayList<UIColumn>();
            FacesContext context = getFacesContext();
            char separator = UINamingContainer.getSeparatorChar(context);
            
            for(UIComponent child : this.getChildren()) {
                if(child instanceof Column) {
                    columns.add((UIColumn) child);
                }
                else if(child instanceof Columns) {
                    Columns uiColumns = (Columns) child;
                    String uiColumnsClientId = uiColumns.getClientId(context);
                    
                    for(int i=0; i < uiColumns.getRowCount(); i++) {
                        CustomDynamicColumn dynaColumn = new CustomDynamicColumn(i, uiColumns);
                        dynaColumn.setColumnKey(uiColumnsClientId + separator + i);
                        columns.add(dynaColumn);
                    }
                }
            }
        }
        
        return columns;
    }    

	@Override	
    protected String resolveSortField() {
        UIColumn column = this.getSortColumn();
        String sortField = null;
        ValueExpression sortVE = this.getValueExpression("sortBy");
        
        if(column == null) {
            sortField = resolveStaticField(sortVE);
        }
        else {
            if(column.isDynamic()) {
                ((CustomDynamicColumn) column).applyStatelessModel();
                sortField = resolveDynamicField(sortVE);
            }
            else {
                sortField = resolveStaticField(sortVE);
            }
            
        }
        
        return sortField;
    }	
	
//	@Override
//	protected void processColumnFacets(FacesContext context, PhaseId phaseId) {  
//	    if(getChildCount() > 0) {
//	        for(UIComponent child : this.getChildren()) {
//	            if(child.isRendered()) {
//	                if(child instanceof UIColumn) {
//	                    if(child instanceof Column) {
//	                        for(UIComponent facet : child.getFacets().values()) {
//	                            process(context, facet, phaseId);
//	                        }
//	                    }
//	                    else if(child instanceof Columns) {
//	                        Columns uicolumns = (Columns) child;
//	                        int f = uicolumns.getFirst();
//	                        int r = uicolumns.getRows();
//	                        int l = (r == 0) ? uicolumns.getRowCount() : (f + r);
//	
//	                        for(int i = f; i < l; i++) {
//	                            uicolumns.setRowIndex(i);
//	
//	                            if(!uicolumns.isRowAvailable()) {
//	                                break;
//	                            }
//	
//	                            for(UIComponent facet : child.getFacets().values()) {
//	                                process(context, facet, phaseId);
//	                            }
//	                        }
//	
//	                        uicolumns.setRowIndex(-1);
//	                    }
//	                }
//	                else if(child instanceof ColumnGroup) {
//	                    if(child.getChildCount() > 0) {
//	                        for(UIComponent row : child.getChildren()) {
//	                            if(row.getChildCount() > 0) {
//	                                for(UIComponent col : row.getChildren()) {
//	                                    if(col instanceof Column && col.getFacetCount() > 0) {
//	                                        for(UIComponent facet : col.getFacets().values()) {
//	                                            process(context, facet, phaseId);
//	                                        }
//	                                    }else if(col instanceof Columns) {
//
//	            	                        Columns uicolumns = (Columns) col;
//	            	                        int f = uicolumns.getFirst();
//	            	                        int r = uicolumns.getRows();
//	            	                        int l = (r == 0) ? uicolumns.getRowCount() : (f + r);
//	            		                                    	
//	                                    	for(UIComponent facetAux : col.getChildren()) {
//                                    	 		if(facetAux instanceof Column){
//	                                                process(context, facetAux, phaseId);
//                                    	 			
//                                    	 		}
//                                    	 	}
//	                                    }
//	                                }
//	                            }            
//	                        }
//	                    }
//	                }
//	            }
//	        }
//	    }
//	}
}
